package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpContractDAO;
import org.jsola.hr.dto.EmpAllContractDeleteDTO;
import org.jsola.hr.dto.EmpContractAddDTO;
import org.jsola.hr.dto.EmpContractDTO;
import org.jsola.hr.dto.EmpContractUpdateDTO;
import org.jsola.hr.entity.EmpContractDO;
import org.jsola.hr.query.EmpContractQuery;
import org.jsola.hr.vo.*;
import org.jsola.user.core.TokenUser;

import javax.validation.constraints.NotNull;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 员工合同信息
 *
 * @author zhr
 */
public interface IEmpContractService extends IService<IEmpContractDAO, EmpContractDO> {

    /**
     * 新增员工合同信息
     *
     * @param empContractAddDTO 新增员工合同信息DTO
     * @param tokenUser         当前用户
     * @return 员工合同信息详情信息
     */
    EmpContractVO save(EmpContractAddDTO empContractAddDTO, TokenUser tokenUser);

    /**
     * 新增员工合同信息  保存do全部数据 仅用于更换公司使用
     *
     * @param empContractDO 新增员工合同信息DO
     * @return 员工合同信息详情信息
     */
    Integer onlySave(EmpContractDO empContractDO);

    /**
     * 批量新增员工合同信息
     *
     * @param empContractAddDTOList 新增员工合同信息DTO
     * @param tokenUser             当前用户
     * @return 员工合同信息详情信息
     */
    List<EmpContractVO> batchSave(List<EmpContractAddDTO> empContractAddDTOList, TokenUser tokenUser);

    /**
     * 修改员工合同信息
     *
     * @param empContractUpdateDTO 修改员工合同信息DTO
     * @param tokenUser            当前用户
     * @return 更新数量
     */
    int update(EmpContractUpdateDTO empContractUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工合同信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser      当前用户
     * @param empContractIds 员工合同信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empContractIds);

    /**
     * 根据员工合同信息id查找
     *
     * @param empContractId 员工合同信息id
     * @param siteId        所属站点id
     * @return 员工合同信息详情信息
     */
    EmpContractVO selectById(String empContractId, String siteId);

    /**
     * 查询员工合同信息
     *
     * @param empContractQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工合同信息列表信息
     */
    List<EmpContractListVO> select(EmpContractQuery empContractQuery, String siteId);

    /**
     * 查询员工合同信息
     *
     * @param publishDate 开始时间
     * @param endDate     技术实践
     * @param dateline    合同期限，单位为月
     * @param fileType    合同类型
     * @param empId       员工Id
     * @param siteId      所属站点id
     * @return 员工合同信息列表信息
     */
    List<EmpContractDO> selectByDateAndType(Date publishDate, Date endDate, Integer dateline
            , String fileType, String empId, String siteId);

    /**
     * 查询员工合同信息记录数
     *
     * @param empContractQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工合同信息记录数
     */
    int selectCount(EmpContractQuery empContractQuery, String siteId);

    /**
     * 分页查询员工合同信息
     *
     * @param empContractQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工合同信息列表信息
     */
    Page<EmpContractListVO> selectPage(EmpContractQuery empContractQuery, String siteId);


    /**
     * 根据员工合同信息id查找
     *
     * @param empContractId 员工合同信息id
     * @param siteId        所属站点id
     * @return 员工合同信息
     */
    EmpContractDO selectDOById(String empContractId, String siteId);

    /**
     * 根据员工合同信息id查找
     *
     * @param empContractId 员工合同信息id
     * @return 员工合同信息
     */
    EmpContractDO selectDOById(String empContractId);

    /**
     * 查询员工合同信息
     *
     * @param empContractQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工合同信息列表
     */
    List<EmpContractDO> selectDO(EmpContractQuery empContractQuery, String siteId);

    /**
     * 根据公司id删除合同
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 发布员工合同
     *
     * @param empContractList 员工合同
     * @param companyId       公司id
     * @param empId           员工id
     * @param tokenUser       当前用户
     */
    void publishEmpContractList(List<EmpContractDTO> empContractList, String companyId, String empId, TokenUser tokenUser);

    /**
     * 查找某员工的所有合同
     *
     * @param empId  员工id
     * @param siteId 站点
     * @return 员工的所有合同
     */
    List<EmpContractDO> listByEmpId(String empId, String siteId);

    /**
     * 获取某员工某种类型的所有合同信息 没有关联的合同
     *
     * @param empId  员工id
     * @param type   类型
     * @param siteId 站点
     * @return 某员工某种类型的所有合同信息
     */
    List<EmpContractDO> listByType(String empId, String type, String siteId);

    /**
     * 员工与合同关联关系map
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工与合同关联关系map
     */
    Map<String, List<EmpContractDO>> getEmpContractMapByCompany(String companyId, String siteId);

    /**
     * 查询某个员工的所有合同中签署时间最近的那一份
     *
     * @param empId  员工id
     * @param siteId 站点Id
     * @return 合同
     */
    EmpContractDO selectByEmpIdWithGmtCreateDesc(String empId, String siteId);

    /**
     * 查询公司下员工的电子合同
     *
     * @param companyId 公司Id
     * @param empIds    员工ids
     * @return 合同
     */
    List<EmpContractDO> selectByCompanyIdAndEmpIds(String companyId, List<String> empIds);

    /**
     * 根据员工id查询电子合同
     *
     * @param empIds 员工ids
     * @return 合同
     */
    List<EmpContractDO> selectByEmpIds(List<String> empIds);

    /**
     * 查询所有未到期的电子合同
     *
     * @return 电子合同
     */
    List<EmpContractDO> listAllNoExpireContract();

    /**
     * 根据合同Id查询花名册合同
     *
     * @param contractId 合同Id
     * @return 花名册合同
     */
    List<EmpContractDO> selectByContractId(Long contractId);

    /**
     * 根据合同Id查询花名册合同
     *
     * @param contractIds 合同Id
     * @return 花名册合同
     */
    List<EmpContractDO> selectByContractIds(List<Long> contractIds);


    /**
     * 导入excel
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param companyId 公司Id
     * @return 成功的条数
     */
    EmpContractExcelVO importFile(File file, TokenUser tokenUser, String companyId);

    /**
     * 分页查询员工全部合同信息（电子、纸质都查询）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @param tokenUser 当前用户
     * @return page
     */
    Page<HrContractVO> pageElectronicAndPaper(EmpContractQuery empContractQuery, TokenUser tokenUser);


    /**
     * 分页查询员工全部合同信息（电子、纸质都查询） 小程序使用 排序规则为剩余有效天数 0》1》99》-1》-99》未填写
     *
     * @param empContractQuery 员工合同信息查询参数
     * @param tokenUser 当前用户
     * @return page
     */
    Page<HrContractVO> pageElectronicAndPaperForXcx(EmpContractQuery empContractQuery, TokenUser tokenUser);

    /**
     * 查询员工各种合同数量（电子、纸质都查询）
     *
     * @param empContractQuery 员工合同信息查询参数
     * @param tokenUser 当前用户
     * @return page
     */
    HrContractCountVO selectElectronicAndPaperNumber(EmpContractQuery empContractQuery, TokenUser tokenUser);

    /**
     * 导出全部合同列表
     *
     * @param empContractQuery 查询参数
     * @param tokenUser 当前用户
     * @return 合同列表
     */
    String exportAllContract(EmpContractQuery empContractQuery, TokenUser tokenUser);

    /**
     * 批量删除员工合同信息，彻底删除(全部合同页面使用：电子合同、纸质合同混在一起删除)
     *
     * @param empAllContractDeleteDTOS 员工合同信息id集合
     * @param tokenUser 当前用户
     * @return 删除数量
     */
    Integer deleteBatchElectronicAndPaperNumber(EmpAllContractDeleteDTO[] empAllContractDeleteDTOS, TokenUser tokenUser);


}


